package com.transaction.test.local.mybatis.service;

/**
 * @author mdl
 * @date 2019/12/19
 */
public interface TransactionPropagationExample {

    /**
     * 清空数据
     */
    void truncated();

    /**
     * 外围Service不加Transaction注解，
     * 调用内部没有抛异常的insert，insert方法都加的是Required
     * 外围抛异常
     */
    void outerNoTransaction_Required_Required();

    /**
     * 外围Service不加Transaction注解，
     * 调用的insert，第一个不抛异常，第二个抛
     */
    void outerNoTransaction_Required_RequiredException();

    /**
     * 外围开启Required事务
     * 外围Service不加Transaction注解，
     * 调用内部没有抛异常的insert，insert方法都加的是Required
     * 外围抛异常
     */
    void outerTransaction_Required_Required();

    /**
     * 外围开启Required事务
     * 外围Service不加Transaction注解，
     * 调用的insert，第一个不抛异常，第二个抛
     */
    void outerTransaction_Required_RequiredException();

    /**
     * 外围开启Required事务
     * 外围Service不加Transaction注解，
     * 调用的insert，第一个不抛异常，第二个抛（try catch包裹）
     */
    void outerTransaction_Required_RequiredExceptionTry();

    /**
     * 外围Service不加Transaction注解，
     * 调用内部没有抛异常的insert，insert方法都加的是Requires_New
     * 外围抛异常
     */
    void outerNoTransaction_RequiresNew_RequiresNew();

    /**
     * 外围Service不加Transaction注解，
     * 调用的insert，第一个不抛异常，第二个抛
     */
    void outerNoTransaction_RequiresNew_RequiresNewException();

    /**
     * 外围Required
     * 调用Required、两个RequiresNew
     * 外部抛异常
     */
    void outerExceptionRequired_Required_RequiresNew_RequiresNew();

    /**
     * 外围Required
     * 调用方法，第一个是Required、第二个是RequiresNew，第三个是带异常的RequiresNew
     * 外部不抛异常
     */
    void outerRequired_Required_RequiresNew_RequiresNewException();

    /**
     * 外围Required
     * 调用方法，第一个是Required、第二个是RequiresNew，第三个是带异常的RequiresNew,第三个被try catch
     * 外部不抛异常
     */
    void outerRequired_Required_RequiresNew_RequiresNewException_Try();

    /**
     * 外围Service不加Transaction注解，
     * 调用内部没有抛异常的insert，insert方法都加的是Nested
     * 外围抛异常
     */
    void outerNoTransaction_Nested_Nested();

    /**
     * 外围Service不加Transaction注解，
     * 调用的insert(Nested)，第一个不抛异常，第二个抛
     * 外围抛异常
     */
    void outerNoTransaction_Nested_NestedException();

    /**
     * 外部开启事务，不指定时默认Required
     * 调用两个Nested
     * 外部抛异常
     */
    void outerExceptionTransaction_Nested_Nested();

    /**
     * 外部开启事务
     * 调用两个Nested，第一个不抛异常，第二个抛异常
     */
    void outerTransaction_Nested_NestedException();

    /**
     * 外部开启事务
     * 调用两个Nested，第一个不抛异常，第二个抛异常（try-catch包裹）
     */
    void outerTransaction_Nested_NestedTry();

}
